package jp.ddo.trismegistos.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import jp.ddo.trismegistos.exception.RsException;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

/**
 * SQLファイル読み込みに関するユーティリティクラス。
 * 
 * @author Nagai Satoshi
 */
public class SqlFileReader {

	/** SQLのデリミタ */
	private static final String DELIMITER = " ";

	/** ログ */
	private static final Logger log = Logger.getLogger(SqlFileReader.class
			.getName());

	/**
	 * 指定したSQLファイル内容を読み込んで1行のSQLを返します。
	 * 
	 * @param filePath
	 *            SQLファイルパス
	 * @param encoding
	 *            エンコーディング
	 * @return ファイルから読み込んだSQL
	 */
	public static final String read(final String filePath, final String encoding) {
		if (StringUtils.isBlank(filePath)) {
			throw new IllegalArgumentException("filePath is " + filePath + ".");
		}
		if (StringUtils.isBlank(encoding)) {
			throw new IllegalArgumentException("encoding is " + encoding + ".");
		}

		final File file = new File(filePath);
		if (file.isFile() == false || file.canRead() == false) {
			throw new RsException("file cannot read : "
					+ file.getAbsolutePath());
		}

		BufferedReader br = null;
		final StringBuilder sql = new StringBuilder();
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					file), encoding));
			String line;
			while ((line = br.readLine()) != null) {
				sql.append(line.trim()).append(DELIMITER);
			}
		} catch (final UnsupportedEncodingException e) {
			throw new RsException("unsupported encoding : " + encoding, e);
		} catch (final FileNotFoundException e) {
			throw new RsException("file not found : " + file.getAbsolutePath(),
					e);
		} catch (final IOException e) {
			throw new RsException("io exception", e);
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (final IOException ignore) {
					log.warn("cannnot close resources", ignore);
				}
			}
		}
		return sql.toString();
	}
}
